//
// Created by PC on 2023/4/28.
/*
http://www.aisichuang.net/#/main/Competition/TitlePage?id=1594&raceId=1304&stateanswer=false
 2023春季伴学挑战赛06：C++语言
    时间限制: 1000 MS 内存限制: 256 MB
6的倍数
题目描述
兔兔给你一个十进制正整数n,问你可以从n中截取多少个不同的子串(连续的若干字符),使得子串构成的数字是6的倍数。
例如：当n=1234时，有且仅有12和234这两个子串是6的倍数。
两个子串只要开始或结束位置有不同，即使内容一样也认为是不同子串，不用考虑高位0的问题，006也算合格的子串。
输入格式
单个整数：表示输入的数字n
输出格式
单个整数：表示6的倍数的子串数量。
样例 #1
样例输入 #1
1234
样例输出 #1
2
提示
对于 20% 的数据，1≤n≤10^9
对于 50% 的数据，1≤n≤10^100
对于 70% 的数据，1≤n≤10^1000
对于 100% 的数据，1≤n≤10^10^6

 * */
// 20分方法 拆位存到数组中
// not pass 只通过了2/10的测试点 后边的8个测试点WA
#include <iostream>
#include <cmath>

int powi(int a, int b);

using namespace std;

int main()
{
    int n=1234,length=0,count=0;
//    cout<<powi(10,0)<<endl;
//    cout<<powi(10,1)<<endl;
//    cout<<powi(10,2)<<endl;
    cin>>n;
    int t=n;
    // 获取整数的长度
    while(t>0)
    {
        length++;
        t/=10;
    }
    t=n;
    int l[length];
    int i=length-1;
    // 拆分每一位存到数组中 最高位存在数组第一位 最低位存数组最后
    while(t>0)
    {
        l[i--]=t%10;
        t/=10;
    }
    for (int i = 0; i < length; ++i)
    {
        for (int j = i; j < length; ++j)
        {
            int t=0;
            for (int k = i; k < j+1; ++k)
            {
//                printf("i:%d j:%d k:%d l[]=%d\n", i,j,k,l[k]);
                int tt=l[k]*int(round(pow(10,j-k))); // 四舍五入
//                int tt=l[k]*powi(10,j-k);
                t+=tt;

//                printf("%d ",l[k]);
            }
            if (t%6==0)
            {
//                printf("%d\n",t);
                count++;
            }
//            printf("\n");
        }
    }
    printf("%d",count);
    return 0;
}

// 计算a^b
int powi(int a, int b)
{
    int ans=1;
    for (int i = 0; i < b; ++i)
    {
        ans*=a;
    }
    return ans;
}
